﻿// 0830train03.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//

#include <iostream>
#include <string>
#include <sstream>
#include <algorithm>
#include <limits>
#include <vector>
#include <deque>
#include <unordered_map>
#include <unordered_set>

using namespace std;

/*

假设房子的总格数是count，小红每回合可能连续跳的步教都放在数组steps中，
请问数组中是否有一种步数的组合，可以让小红两个回合跳到最后一格?
如果有，请输出索引和最小的步数组合。
输入
[1,4,5,2]
7

输出
[5,2]
 */

class Solution01
{
public:
    int index_sum = INT_MAX;
    vector<int>result;
    Solution01(vector<int>&num_vec, int target)
    {
        unordered_map<int, int>oh_map; //value index

        for (int i=0; i<num_vec.size(); i++)
        {
            int curr_num = num_vec[i];
            if (oh_map.count(curr_num)>0)
            {
                int prev_i = oh_map.at(curr_num);
                if (i+prev_i<index_sum)
                {
                    result = { num_vec[prev_i],num_vec[i] };
                    index_sum = i + prev_i;
                }
            }
            else
            {
                oh_map[target - curr_num] = i;
            }
        }

        cout << '[' << result[0] << ',' << result[1] << ']';
        //Solution01
    }
};


/*
 仪器记录坐标时,坐标的数据格式为(x,y)，如(1,2), (100,200)，
 其中0 < x < 1000， 0 < y < 1000
 同时存在非法坐标，如(01,1)，(1,01)，(0,100)属于非法坐标。
设定探险队总部的坐标为(0,0)，某位置相对总部的距离为: xx+yy。
若两个座标的相对总部的距离相同，则第一次到达的坐标为最远的足迹。
若记录仪中的坐标都不合法，输出总部坐标(0,0)

重点：x, y都不能为0

输入描述
字符串，表示记录仪中的数据。
如: ferga13fdsf3(100,200)f2r3rfasf(300,400)

输出描述
字符串，表示最远足迹到达的坐标。
如： (300,400)

输入
ferg(3,10)a13fdsf3(3,4)f2r3rfasf(5,10)
输出
(5,10)

输入
asfefaweawfaw(0,1)fe
输出
(0,0)

 */

class Solution02
{
public:
    int curr_count = 0;
    vector<vector<int>>track;
    bool checkNum(string&num_str)
    {
        if (num_str[0] == '0') return false;

        for (auto&oh_char:num_str)
        {
            bool is_num = oh_char >= '0' && oh_char <= '9';
            if (!is_num) return false;
        }

        return stoi(num_str) > 0 && stoi(num_str) < 1000;
        //checkNum
    }

    void updateTrack(string&pos_str)
    {
        if (pos_str.find(',') == string::npos) return;

        pos_str = pos_str.substr(1, pos_str.size() - 2);

        int split = pos_str.find(',');

        string x = pos_str.substr(0, split);
        string y = pos_str.substr(split + 1);

        if (checkNum(x)&&checkNum(y))
        {
            curr_count += 1;
            vector<int>curr_pos = { stoi(x),stoi(y), curr_count };
            track.push_back(curr_pos);
        }

        //updateTrack
    }

    Solution02(string&origin_str)
    {
        int s_size = origin_str.size();
        int left_i = 0;
        bool is_left = false;
        for (int right_i=0; right_i< s_size;right_i++)
        {
            //碰到左括号，is_find, left_index记左括号
            //碰到右括号，重置is_find
            if (origin_str[right_i] == '(')
            {
                left_i = right_i;
                is_left = true;
            }
            if (origin_str[right_i] == ')' && is_left)
            {
                //第二个参数length
                string curr = origin_str.substr(left_i, right_i-left_i+1);
                updateTrack(curr);
                is_left = false;
            }
        }

        //若两个座标的相对总部的距离相同，则第一次到达的坐标为最远的足迹

        sort(track.begin(), track.end(), [](vector<int>& a, vector<int>& b)
            {
                int distance_a = pow(a[0], 2) + pow(a[1], 2);
                int distance_b = pow(b[0], 2) + pow(b[1], 2);

				if (distance_a==distance_b)
				{
                    return a[2] < b[2];
				}
                return distance_a > distance_b;
            });

        if (track.empty())
        {
            cout << "(0,0)";
            return;
        }

        cout << '(' << track[0][0] << ',' << track[0][1] <<')';

        //Solution02
    }
};


/*
每行记录一条金额，
金额带有货币单位，格式为数字+单位，可能是单独元，或者单独分，或者元与分的组合
要求将这些货币全部换算成人民币分（fen）后进行汇总，汇总结果仅保留整数，小数部分舍弃
元和分的换算关系都是1:100，如下：
1CNY=100fen（1元=100分）
1HKD=100cents（1港元=100港分）
1JPY=100sen（1日元=100仙）
1EUR=100eurocents（1欧元=100欧分）
1GBP=100pence（1英镑=100便士）
汇率表如下：
即：100CNY = 1825JPY = 123HKD = 14EUR = 12GBP

CNY	JPY	 HKD	EUR	GBP
100	1825 123	14	12
输入描述

第一行输入为N，N表示记录数。0<N<100
之后N行，每行表示一条货币记录，且该行只会是一种货币。

输出描述
将每行货币转换成人民币分（fen）后汇总求和，只保留整数部分。
输出格式只有整数数字，不带小数，不带单位 1825

输入
1
100CNY
输出
10000

100CNY转换后是10000fen，所以输出结果为10000

输入
2
20CNY53fen
53HKD87cents
输出
6432


1
100pence
1CNY=100fen（1元=100分）
1HKD=100cents（1港元=100港分）
1JPY=100sen（1日元=100仙）
1EUR=100eurocents（1欧元=100欧分）
1GBP=100pence（1英镑=100便士）
 */

class Solution03
{
public:
    bool isNum(char oh_char)
    {
        return oh_char >= '0' && oh_char <= '9';
    }

    void updateResult(vector<double>&num_vec, string kind)
    {
        double change_num = num_vec[0];
        if (num_vec.size() == 2)
        {
            change_num += num_vec[1] / 100;
        }
        
        if (translate_map.count(kind)>0)
        {
        	double split_num = translate_map.at(kind);
            //int hk = (53.87 / 123 * 100) * 100;
            double curr = change_num * 100 * 100 / split_num ;
            result += curr;
        }
        else
        {
            //输入是分的情况
            string real_kind = linked_map[kind];
            double split_num = translate_map[real_kind];
            double curr = change_num * 100 / split_num ;
            result += curr;
        }
        //updateResult
    }

    Solution03(vector<string>&str_vec)
    {
        //100CNY = 1825JPY = 123HKD = 14EUR = 12GBP

        for (auto&oh_str:str_vec)
        {
            int curr_num = 0;
            
            vector<double>num_vec;
            string kind;
            for (int i=0; i<oh_str.size(); i++)
            {
                char curr = oh_str[i];
                if (isNum(curr))
                {
                    curr_num = curr_num * 10 + (curr - '0');
                }
                else
                {
                    if (curr_num!=0)
                    {
                        num_vec.push_back(curr_num);
                        curr_num = 0;
                    }

                    //如果两个kind，剩下一个一定是分
                    if (num_vec.size()==1)
                    {
                        kind += oh_str[i];
                    }

                }
                //------
            }
            updateResult(num_vec, kind);

            //oh_str
        }

        cout << int(result);
        //Solution03
    }
private:
    double result = 0;
    unordered_map<string, int>translate_map =
    {
        {"CNY", 100},
        {"JPY", 1825},
        {"HKD", 123},
        {"EUR", 14},
        {"GBP", 12}
    };
    unordered_map<string, string>linked_map =
    {
		{"fen", "CNY"},
		{"cents","HKD"},
		{"sen","JPY"},
		{"eurocents","EUR"},
		{"pence","GBP"}
    };
};

int main()
{
	{
        /*
         1CNY=100fen（1元=100分）
1HKD=100cents（1港元=100港分）
1JPY=100sen（1日元=100仙）
1EUR=100eurocents（1欧元=100欧分）
1c=100pence（1英镑=100便士）
         */
        //20元53分 + 53港元87港分，换算成人民币分后汇总，为6432
  //      int num = 20.53 * 100 ;
		//int hk = (100 * 100 / 123) ;
  //      
  //      num = num + hk;
        //cout << hk;
        //return 0;
	}
	{
/*
1
100CNY
 */
        //int v_size;
        //cin >> v_size;
        //vector<string>str_vec(v_size);

        //for (int i=0; i<v_size; i++)
        //{
        //    cin >> str_vec[i];
        //}

        //Solution03 solu(str_vec);

        //return 0;
	}
	{
        //string origin_str = "ferga13fdsf3(100,200)f2r3rfasf(300,400)";
        //ferga13fdsf3(100,200)f2r3rfasf(200,100)
        string origin_str;
        getline(cin, origin_str);

        Solution02 solu(origin_str);

        return 0;
	}
/*
[1,4,5,2]
7
*/
    vector<int>num_vec;
    string num_str;
    getline(cin, num_str);
    num_str = num_str.substr(1, num_str.size()-2);
    string token;
    stringstream oh_sstream(num_str);

    while (getline(oh_sstream,token,','))
    {
        num_vec.push_back(stoi(token));
    }

    string target_str;
    getline(cin, target_str);
    Solution01 solu(num_vec, stoi(target_str));

}

// 运行程序: Ctrl + F5 或调试 >“开始执行(不调试)”菜单
// 调试程序: F5 或调试 >“开始调试”菜单

// 入门使用技巧: 
//   1. 使用解决方案资源管理器窗口添加/管理文件
//   2. 使用团队资源管理器窗口连接到源代码管理
//   3. 使用输出窗口查看生成输出和其他消息
//   4. 使用错误列表窗口查看错误
//   5. 转到“项目”>“添加新项”以创建新的代码文件，或转到“项目”>“添加现有项”以将现有代码文件添加到项目
//   6. 将来，若要再次打开此项目，请转到“文件”>“打开”>“项目”并选择 .sln 文件
